package com.wyix.service;

/**
 * 异步日志服务，通过独立线程将日志写入数据库
 *
 * @author wangdx
 * @since 2025/8/1
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class LogService {
    // 单例日志线程（守护线程）
    private static final Thread logThread;

    static {
        // 初始化日志线程
        logThread = new Thread(() -> {
            System.out.println("日志线程启动，开始监听日志队列...");
            while (!Thread.currentThread().isInterrupted()) { // 响应中断信号
                String log = LogQueue.take();
                if (log != null) {
                    saveToDb(log); // 写入数据库
                }
            }
            System.out.println("日志线程已停止");
        }, "日志线程");

        logThread.setDaemon(true); // 设为守护线程，随主线程退出
        logThread.start(); // 启动线程
    }

    /**
     * 模拟日志写入数据库
     */
    private static void saveToDb(String log) {
        // 实际项目中使用数据库连接池，此处简化为直连
        String url = "jdbc:mysql://localhost:3306/log_db";
        String user = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement ps = conn.prepareStatement("INSERT INTO operation_log (content) VALUES (?)")) {

            ps.setString(1, log);
            ps.executeUpdate();
            System.out.println("[日志已保存] " + log);

        } catch (SQLException e) {
            System.err.println("日志写入数据库失败：" + e.getMessage());
        }
    }

    /**
     * 对外提供的日志记录接口（业务线程调用）
     */
    public static void log(String message) {
        LogQueue.put(message); // 放入队列，立即返回
    }

    // 测试方法
    public static void main(String[] args) {
        // 模拟10个业务线程记录日志
        for (int i = 0; i < 10; i++) {
            int orderId = i + 1000;
            new Thread(() -> {
                LogService.log("订单创建成功：" + orderId);
            }, "业务线程-" + i).start();
        }
    }
}